
#ifndef _CSG_H_
#define _CSG_H_

//////////////////////////////////////////////////////////////////////////////////////
// NOTES /////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/*
	CSG commands
*/

//////////////////////////////////////////////////////////////////////////////////////
// COMMON INCLUDES ///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
#include ".\..\DBOFormat\DBOFormat.h"

//////////////////////////////////////////////////////////////////////////////////////
// DEFINES ///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
#define SAFE_DELETE( p )       { if ( p ) { delete ( p );       ( p ) = NULL; } }
#define SAFE_RELEASE( p )      { if ( p ) { ( p )->Release ( ); ( p ) = NULL; } }
#define SAFE_DELETE_ARRAY( p ) { if ( p ) { delete [ ] ( p );   ( p ) = NULL; } }
#define SAFE_MEMORY( p )       { if ( p == NULL ) return false; }
#define MAX_STRING				256

//////////////////////////////////////////////////////////////////////////////////////
// CLASS DEFINITION //////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

class cCompiler;

class cCSG
{
	public:
		struct sVertex
		{
			// used to store vertex information

			float x, y, z;			// position
			float nx, ny, nz;		// normals
			float tu, tv;			// texture coordinates
		};

		void BuildVertexAndIndexList ( cCompiler* pA, cCompiler* pB, sMesh* pMesh );

		int ClockWise ( sVertex *p, int n);
		
	public:
		cCSG  ( );
		~cCSG ( );

		bool Union			( sMesh* pMeshA, D3DXMATRIX matA, sMesh* pMeshB, D3DXMATRIX matB );
		bool Difference		( sMesh* pMeshA, D3DXMATRIX matA, sMesh* pMeshB, D3DXMATRIX matB );
		bool Intersection	( sMesh* pMeshA, D3DXMATRIX matA, sMesh* pMeshB, D3DXMATRIX matB );
		bool Clip			( sMesh* pMeshA, D3DXMATRIX matA, sMesh* pMeshB, D3DXMATRIX matB );
};

#endif _CSG_H_
